﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SW2A311A
{
    public class VentingDryer : Dryer
    {
        #region Instansvariabler
        public bool HoseIncluded { get; protected set; }
        #endregion

        #region Constructor
        // VentingDryer instantieres med inputparametre til alle fields og proporties, 
        // og sender dem videre til superklasserne Dryer og Product den ikke selv har fields til.
        public VentingDryer(string name, double price, Dimensions dimension, double capacity,
            int dryTime, double energyConsumption, int noiseLevel, bool hoseIncluded)
            : base(name, price, dimension, capacity, dryTime, energyConsumption, noiseLevel)
        {
            HoseIncluded = hoseIncluded;
            EnergyClass = GetEnergyClass();
        }
        #endregion

        #region Metoder
        // Vi instantiere en Range-struct med min og max værdierne for hver energi-klasse hvorefter
        // vi med det samme kalder metoden DryerIsBetween() med den aktuelle værdi som indput parameter.
        // Range returnere true hvis indput parameteren lå mellem min og max ellers returneres false.
        public override EEnergyClass GetEnergyClass()
        {
            double energyCalc = EnergyConsumption / Capacity;
            if (new Range(0, 0.51).IsBetweenOrEqualMax(energyCalc))
                return EEnergyClass.A;
            else if (new Range(0.51, 0.59).IsBetweenOrEqualMax(energyCalc))
                return EEnergyClass.B;
            else if (new Range(0.59, 0.67).IsBetweenOrEqualMax(energyCalc))
                return EEnergyClass.C;
            else if (new Range(0.67, 0.75).IsBetweenOrEqualMax(energyCalc))
                return EEnergyClass.D;
            else if (new Range(0.75, 0.83).IsBetweenOrEqualMax(energyCalc))
                return EEnergyClass.E;
            else if (new Range(0.83, 0.91).IsBetweenOrEqualMax(energyCalc))
                return EEnergyClass.F;
            else
                return EEnergyClass.G;
        }

        // ToString metode override der returnerer en string med alle fields og proporties fra VentingDryer.
        public override string ToString()
        {
            return string.Format("Type: Venting Dryer\nManufacturer: {0}\nHose included: {1}\nCapacity: {2}L\n" +
                "Energiforbrug: {3}kWh\nEnergiklasse: {4}\nDimensioner: {5}\nPris: {6:C}\n",
                Name, HoseIncluded ? "Ja" : "Nej", Capacity,
                EnergyConsumption, EnergyClass, Dimension, Price
                );
        }

        #region Equals metoder
        // Override af Equals metoden. Den tester om objektet metoden kaldes på er værdi-mæssigt ens med indput parameter objektet.
        // Sammenligning med et object (hvis typen ikke kendes).
        public override bool Equals(object obj)
        {
            VentingDryer p = obj as VentingDryer;       // Cast'er objectet til et VentingDryer object.

            if (this.GetType() != obj.GetType())        // Tjek om værdi-typerne er ens for de 2 objecter.
                return false;

            return base.Equals(obj) &&
                HoseIncluded == p.HoseIncluded;
        }
        // Sammenligning med en anden VentingDryer hvor typen kendes.
        public bool Equals(VentingDryer p)
        {
            return base.Equals((Dryer)p) &&
                HoseIncluded == p.HoseIncluded;
        }
        // GetHashCode skal overrides sammen med Equals. Vi generer en seudo-telfældig hash kode.
        public override int GetHashCode()
        {
            return base.GetHashCode() ^
                HoseIncluded.GetHashCode();
        }
        #endregion
        #endregion
    }
}
